package com.lanou3g.code0420;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 * Created by dllo on 18/4/20.
 */
public class Main {
    public static void main(String[] args) {
        //建立一次连接尽可能发送多的数据，优点是稳定，安全，但缺点是效率低

        //TCP 客户端
        //使用无参数的构造方法，这个socket对象会自动绑定本地的一个没有被使用的端口号
        // 如果传参数是指定端口号，但这个端口号可能会被占用 eg：new Socket("127.0.0.1",7789)，所以，一般让电脑自行找端口号
        //如果知道某电脑QQ的端口和ip，理论上是可以任意的发送数据的
        Socket socket = new Socket();  //客户端需要socket对象
        PrintWriter pw = null;

        Scanner scanner = new Scanner(System.in);
        try {
            //本机回旋地址，指的是本机，还有个名字叫做localhost
            // 让socket连接到远程服务器
            //连接时，需要指定IP地址和端口号
            socket.connect(new InetSocketAddress("127.0.0.1",7932)); //程序走过这行代码，代表二者已连接

            //开启线程来读数据
            new ReadThread(socket).start(); //读写在两个线程中进行

            OutputStream os = socket.getOutputStream(); //获取一个输出流对象
            pw = new PrintWriter(new OutputStreamWriter(os));
            while (true) {
                String line = scanner.nextLine();


                // 引起乱码（可用于解决windows乱码）
//                String agter = new String(line.getBytes("utf-8"),"GBK");
//                pw.println(agter);
                pw.println(line);
                pw.flush();
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (pw != null)
                pw.close();  //（colse中自带flush） 缓冲数组 是8196，如果不够是不会发的，所以需要flush

            try {
                //socket 对象使用完成后，也需要关闭
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            scanner.close();//scanner使用完毕后，也需要关闭，前提是在所有的输入操作都完成后才进行关闭


        }


    }

}
